2.3.5 FSM(有限状态机):完整的状态机实现
这是由五个练习组成的系列中的第四个部分,旨在通过几个小型电路构建一个复杂的计数器。关于整体设计,请参阅2.3第6小结。
你可能希望先完成“请参阅2.3第4小结FSM:启用移位寄存器”和“请参阅2.3第3小结FSM:序列识别器”这两个练习。
我们想要创建一个计时器,它需要满足以下条件:
- 当检测到特定模式(1101)时启动;
- 移位输入另外4位比特以确定延迟的持续时间;
- 等待计数器完成计数;
- 通知用户并等待用户确认计时器已完成。
在这个问题中,仅实现控制计时器的有限状态机(FSM)。数据路径(包括计数器和一些比较器)在这里不包括在内。
串行数据通过数据输入引脚可用。当接收到模式1101时,状态机必须紧接着在接下来的正好4个时钟周期内使能输出shift_ena。
之后,状态机应断言其计数输出,表明它正在等待计数器,并等待直到输入done_counting为高电平。
此时,状态机必须断言done以通知用户计时器已超时,并等待直到输入ack为1,然后重置以寻找下一个起始序列(1101)的 出现。
状态机应重置到一个状态,开始搜索输入序列1101。
以下是预期输入和输出的一个示例。'x'状态可能稍微难以理解。它们表示在那个周期中,状态机不应该关心那个特定的输入信号。例如,一旦检测到1101模式,状态机在完成所有其他操作之前重新开始搜索之前,将不再查看数据输入。
模块声明
module top_module (
input clk,
input reset, // Synchronous reset
input data,
output shift_ena,
output counting,
input done_counting,
output done,
input ack );